import 'package:flutter/material.dart';


///
/// InheritedWidget是Flutter中非常重要的一个功能型组件，它提供了一种数据在widget树中从上到下
/// 传递、共享的方式，比如我们在应用的根widget中通过InheritedWidget共享了一个数据，那么我们便
/// 可以在任意子widget中来获取该共享的数据！这个特性在一些需要在widget树中共享数据的场景中非常方
/// 便！如Flutter SDK中正是通过InheritedWidget来共享应用主题（Theme）和Locale (当前语言环
/// 境)信息的。
/// 
/// InheritedWidget和React中的context功能类似，和逐级传递数据相比，它们能实现组件跨级传递数据。
/// InheritedWidget的在widget树中数据传递方向是从上到下的，这和通知Notification（将在下一章中
/// 介绍）的传递方向正好相反。
/// 
class ShareDataWidget extends InheritedWidget {
  ShareDataWidget({
    @required this.data,
    Widget child
  }) : super(child: child);

  final int data;   // 需要在子树中共享的数据，保存点击次数

  /// 定义一个便捷方法，方便子树中的widget获取共享数据
  static ShareDataWidget of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<ShareDataWidget>();
  }

  /// 该回调决定当data发生变化时，是否通知子树中依赖data的Widget
  @override
  bool updateShouldNotify(ShareDataWidget oldWidget) {
    /// 如果返回true，则子树中依赖(build函数中有调用)本widget
    /// 的子widget的`state.didChangeDependencies`会被调用
    return oldWidget.data != data;
  }
}


class _TestWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _TestWidgetState();
  }
}
class _TestWidgetState extends State<_TestWidget> {
  @override
  Widget build(BuildContext context) {
    /// 使用InheritedWidget中的共享数据
    return Text(ShareDataWidget.of(context).data.toString());
  }

  /// State对象有一个didChangeDependencies回调，它会在“依赖”发生变化时被Flutter Framework调用。
  /// 而这个“依赖”指的就是子widget是否使用了父widget中InheritedWidget的数据！如果使用了，则代表
  /// 子widget依赖有依赖InheritedWidget；如果没有使用则代表没有依赖。这种机制可以使子组件在所依赖
  /// 的InheritedWidget变化时来更新自身！比如当主题、locale(语言)等发生变化时，依赖其的子widget
  /// 的didChangeDependencies方法将会被调用。
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    /// 父或祖先widget中的InheritedWidget改变(updateShouldNotify返回true)时会被调用。
    /// 如果build中没有依赖InheritedWidget，则此回调不会被调用。
    print("Dependencies change");
  }
}


class InheritedWidgetTestRoute extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _InheritedWidgetTestRouteState();
  }
}

class _InheritedWidgetTestRouteState extends State<InheritedWidgetTestRoute> {

  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Share Data Widget"),
      ),
      body: Center(
        child: ShareDataWidget( /// 使用ShareDataWidget
          data: count,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.only(
                  bottom: 20
                ),
                child: _TestWidget(), /// 子widget中依赖ShareDataWidget
              ),
              RaisedButton(
                child: Text("Increment"),
                /// 每点击一次，将count自增，然后重新build,ShareDataWidget的data将被更新
                onPressed: () => setState(() => ++ count),
              )
            ],
          ),
        ),
      ),
    );
  }
}